home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr52 / cl504er.zip / CL5104.TXT < prev   
Text File  |  1993-04-01  |  51KB  |  1,714 lines

  1.  
  2.   README           About this report.
  3.  
  4.  Report Name:  CL5104                                 Report Date: 09/08/91
  5.  Author: Compiled by Jo W. French dba Practical Computing of La Canada
  6.                      290 Starlight Crest Drive
  7.                      La Canada, CA 91011
  8.                      (818) 790-3699
  9.                      CompuServe ID:  74730,1751
  10.  
  11.  Note: Supercedes CL5103. ^b*^b indicates corrections and additions.
  12.  
  13.  This report pertains to Clipper(r) 5.01. Each item herein contains the
  14.  applicable version number. It has been compiled from messages posted
  15.  on CompuServe forums from 04/19/91 through 09/07/91. The author has
  16.  verified most, but not all, of the stated anomalies. The severity of
  17.  each item is best left to the reader's judgement.
  18.  
  19.  Verification Conditions.
  20.  
  21.    a) COMPILER: Clipper 5.01 version 1.29 dtd 04/15/91.
  22.    b) LINKER:  RTLINK version 3.13, as supplied by lanquage vendor.
  23.  
  24.    c) Note: System and DOS changed 8/91 From:
  25.  
  26.       SYSTEM: IBM PS/2 Model 80 with 4Mb RAM, 222 Mb Fixed Disk.
  27.       DOS Version: IBM DOS version 3.30
  28.       CONFIG.SYS:
  29.         DEVICE=c:\dos\vdisk.sys 1536 512 128 /E
  30.         DEVICE=c:\qemm\qemm.sys RAM
  31.         SHELL=c:\command.com /E:512 /P
  32.         FILES=51
  33.         BUFFERS=8
  34.       ENVIRONMENT
  35.         COMSPEC=C:\COMMAND.COM
  36.         PROMPT=$p$g
  37.         PATH=C:\dos;C:\bat;C:\;C:\me;C:\ws5;F:\clipper5\bin;D:\trh;
  38.              C:\qemm;F:\ng;
  39.         LIB=F:\clipper5\lib;
  40.         INCLUDE=F:\clipper5\include;
  41.         OBJ=F:\clipper5\obj;
  42.         PLL=F:\clipper5\pll;
  43.         CLIPPER=F21;
  44.       EXTENDED MEMORY: 1536Kb (DOS VDISK)
  45.       EXPANDED MEMORY: 1536Kb (QEMM vs. 5.0)
  46.       TSR's: All TSR's are loaded above 9FFF using QEMM's LOADHI.
  47.  
  48.    d) To:
  49.  
  50.       SYSTEM: IBM PS/2 Model 80 with 8Mb RAM, 222 Mb Fixed Disk.
  51.       DOS Version: IBM DOS version 5.00
  52.       CONFIG.SYS
  53.         DEVICE=C:\QEMM\QEMM386.SYS RAM NOSORT DMA=128
  54.         DEVICE=C:\QEMM\LOADHI.SYS /R:1 C:\DOS\SMARTDRV.SYS 256 256 /A
  55.         DEVICE=C:\QEMM\LOADHI.SYS /R:2 C:\STACKER\STACKER.COM  ( E: & F: )
  56.         DEVICE=C:\QEMM\LOADHI.SYS /R:1 C:\DOS\RAMDRIVE.SYS 3072 512 128 /A
  57.         DEVICE=C:\QEMM\LOADHI.SYS /R:2 C:\DOS\SETVER.EXE
  58.         DEVICE=C:\STACKER\SSWAP.COM F: G:
  59.         DEVICE=C:\STACKER\SSWAP.COM E: H:
  60.         SHELL=C:\COMMAND.COM C:\ /E:512 /P
  61.         FILES=10
  62.         BUFFERS=8
  63.         DOS=HIGH
  64.       ENVIRONMENT
  65.         COMSPEC=C:\COMMAND.COM
  66.         PROMPT=$P$G
  67.         TEMP=I:\TMP
  68.         PATH=C:\dos;C:\bat;C:\STACKER;C:\;C:\qe;C:\me;C:\ws5;F:\cl5\bin;
  69.              C:\qemm;F:\ng;F:\blink
  70.         GLOB=C:\DOS\GLOB.EXE
  71.         LIB=F:\cl5\lib;
  72.         INCLUDE=F:\cl5\include;
  73.         OBJ=F:\cl5\obj;
  74.         PLL=F:\cl5\pll;
  75.         CLIPPER=//F:21;
  76.  
  77. ==============================================================================
  78.  
  79.                |D|A|M|N|
  80.                 | | | | New since last release.
  81.                 | | | Miscellaneous comments.
  82.                 | | Anomaly.
  83.                 | Documentation error / omission.
  84.  
  85. ==============================================================================
  86.   AEVAL()           Undocumented return reference.
  87.  
  88.   ^bClipper Version^b  1.29 dtd 04/15/91.
  89.  
  90.   ^bProblem Statement^b
  91.  
  92.   AEVAL() documentation does not mention the presence of a second return
  93.   reference; i.e., the element number.
  94.  
  95.   ^bCause^b
  96.  
  97.   Documentation omission.
  98.  
  99.   ^bWork Around(s)^b
  100.  
  101.   Annotate your documentation.
  102.  
  103. ==============================================================================
  104.   ALERT()           Miscellaneous Comments
  105.  
  106.   ^bClipper Version^b  1.29 dtd 04/15/91.
  107.  
  108.   ^bProblem Statement^b
  109.  
  110.   a) ALERT()'s prompt is limited to 4 choices.
  111.  
  112.   b) There is an undocumented third parameter, cColorString, which may be
  113.      a color pair such as "W/N".
  114.  
  115.   c) The environmental parameter, NOALERT, will prevent the display of
  116.      any messages to be generated by this function.
  117.  
  118.   d) In general, this function should be used for error situations, only.
  119.      It may have a detrimental effect on other screen environment settings
  120.      (note that it cannot be contained by DISPBEGIN() / DISPEND()).
  121.  
  122.   ^bCause^b
  123.  
  124.   a) -c) Documentation omission.
  125.  
  126.   d) N/A
  127.  
  128.   ^bWork Around(s)^b
  129.  
  130.   a) - c) Annotate your documentation.
  131.  
  132.   d) Write your own ALERT() equivalent function.
  133.  
  134. ==============================================================================
  135.   APPEND FROM       Append From Delimited with Character Numbers.
  136.  
  137.   ^bClipper Version^b  1.29 dtd 04/15/91.
  138.  
  139.   ^bProblem Statement^b
  140.  
  141.   APPEND FROM DELIMITED does not translate numbers enclosed in quotes to
  142.   numerics for input to a numeric field.
  143.  
  144.   ^bCause^b
  145.  
  146.   Unknown
  147.  
  148.   ^bWork Around(s)^b
  149.  
  150.   Unknown.
  151.  
  152. ==============================================================================
  153.   ATAIL()           Miscellaneous comment.
  154.  
  155.   ^bClipper Version^b  1.29 dtd 04/15/91.
  156.  
  157.   ^bProblem Statement^b
  158.  
  159.   Per the documentation, ATAIL(aArray) 'gets' the value of the last element
  160.   in the array. It may NOT be used to 'set' the value and will return
  161.   Compiler error 2042, Invalid lvalue, if you attempt to use it in this
  162.   fashion.
  163.  
  164.   ^bCause^b
  165.  
  166.   N/A.
  167.  
  168.   ^bWork Around(s)^b
  169.  
  170.   Use aArray[ Len(aArray) ] := something to 'set' a value.
  171.  
  172. ==============================================================================
  173.   BOF()             Set to .T. on LastRec() + 1 access.
  174.  
  175.   ^bClipper Version^b  1.29 dtd 04/15/91.
  176.  
  177.   ^bProblem Statement^b
  178.  
  179.   BOF() will return .T. under the following example:
  180.        USE test
  181.        GO LASTREC() + 1
  182.        ? BOF()   // => .T.
  183.  
  184.   ^bCause^b
  185.  
  186.   Unknown.
  187.  
  188.   ^bWork Around(s)^b
  189.  
  190.   Don't 'Jump' to LastRec() + 1 and test for BOF(). Skip works ok.
  191.  
  192. ==============================================================================
  193.   BREAK/RECOVER     May not return code block.
  194.  
  195.   ^bClipper Version^b  1.29 dtd 04/15/91.
  196.  
  197.   ^bProblem Statement^b
  198.  
  199.   The BREAK / RECOVER USING methodology may not return a code block.
  200.   Here's one example from Jeff Cheney [72570,675] :
  201.  
  202.     *********************
  203.     ** PRNERROR.PRG    **
  204.     ** compile with /N **
  205.     *********************
  206.     FUNCTION prnError
  207.     LOCAL lErrorObj
  208.     SET DEVICE TO PRINT
  209.     DO WHILE .T.
  210.       // begin trapping printer errors
  211.       BEGIN SEQUENCE
  212.         // make sure printer is turned off to invoke handler
  213.         @ 1,0 SAY "!!!!!"
  214.         RECOVER USING lErrorObj
  215.         // set a break point here and have a look at lErrorObj with
  216.         //   Monitor Locals under the debugger, it's NOT AN OBJECT anymore!
  217.         IF lErrorObj:cargo
  218.           LOOP
  219.         ELSE
  220.           EXIT
  221.         ENDIF
  222.       END SEQUENCE
  223.     ENDDO
  224.     SET DEVICE TO SCREEN
  225.     RETURN NIL
  226.  
  227.     **********************
  228.     ** ERROR.prg        **
  229.     ** compile with /N  **
  230.     **********************
  231.     #include "Error.Ch"
  232.  
  233.     FUNCTION errorsys
  234.     // set up new error handler
  235.     ERRORBLOCK( { | lErrorObj | ErrorTest( lErrorObj ) } )
  236.     RETURN NIL
  237.  
  238.     FUNCTION ErrorTest( lErrorObj )
  239.     LOCAL lChoice,lSetDevice
  240.     IF lErrorObj:genCode == EG_PRINT .AND. lErrorObj:canRetry
  241.       lSetDevice := SET( _SET_DEVICE,"SCREEN" )
  242.       lChoice := ALERT( "Printer Error", { "Abort","Retry","Restart" } )
  243.       SET( _SET_DEVICE,lSetDevice )
  244.       IF lChoice <> 2
  245.         lErrorObj:cargo := ( lChoice == 3 )
  246.         BREAK                  // I also tried BREAK( lChoice == 3 )
  247.       ENDIF                    //   and BREAK( lErrorObj ) but it acts
  248.     ENDIF                      //   the same way
  249.     RETURN ( lChoice == 2 )
  250.  
  251.   ^bCause^b
  252.  
  253.   Unknown.
  254.  
  255.   ^bWork Around(s)^b
  256.  
  257.   Code would be unique to each incidence.
  258.  
  259. ==============================================================================
  260.   Browse:footSep    Documentation ommission.
  261.  
  262.   ^bClipper Version^b  1.29 dtd 04/15/91.
  263.  
  264.   ^bProblem Statement^b
  265.  
  266.   browse:footSep is missing from the documentation. This is a footing
  267.   separator for the browse object. It may be overridden by a col:footSep.
  268.  
  269.   ^bCause^b
  270.  
  271.   Documentation ommission.
  272.  
  273.   ^bWork Around(s)^b
  274.  
  275.   Annotate your manual to include this Instance Variable.
  276.  
  277. ==============================================================================
  278.   CLD               Debugger anomalies.
  279.  
  280.   ^bClipper Version^b  1.29 dtd 04/15/91.
  281.  
  282.   ^bProblem Statement^b
  283.  
  284.   1) The debugger will indicate incorrect variable values following a
  285.      PARAMETERS statement.
  286.  
  287.   2) The debugger will not return the values stored in cargo when the
  288.      values are contained in a multi-dimensioned array; e.g:
  289.  
  290.         ? oTb:cargo[1,1]  no workee.
  291.  
  292.   3) The debugger returns the row/column in the debugger when queried,
  293.      not the ROW() / COL() in the application.
  294.  
  295.   ^bCause^b
  296.  
  297.   1 - 3 Unknown.
  298.  
  299.   ^bWork Around(s)^b
  300.  
  301.   1) If possible, avoid using the PARAMETERS statement.
  302.  
  303.   2) & 3) Assign to a variable, then query the variable; e.g.;
  304.                 #ifdef TEST
  305.                   aVar := oTb:cargo
  306.                 #endif
  307.           Then ? aVar[1,1] when in the debugger.
  308.  
  309. ==============================================================================
  310.   COL()             COL() returns 0 after MENU TO.
  311.  
  312.   ^bClipper Version^b  1.29 dtd 04/15/91.
  313.  
  314.   ^bGeneral Statement^b
  315.  
  316.   COL() will return the column at the end of the prompt if queried
  317.   before the MENU TO. It returns 0 after the MENU TO.
  318.  
  319. ==============================================================================
  320.   CLOSE DATABASES   Does not change current work area.
  321.  
  322.   ^bClipper Version^b  1.29 dtd 04/15/91.
  323.  
  324.   ^bProblem Statement^b
  325.  
  326.   CLOSES DATABASES does not change the current work area; e.g.:
  327.  
  328.          Use File1 New
  329.          Use File2 New
  330.          Close Databases   // or DBCloseAll()
  331.          ? Select()        // => 2
  332.  
  333.   which is not compatible with S '87.  A 'Use File' will open the file in
  334.   workarea 2.
  335.  
  336.   ^bCause^b
  337.  
  338.   See Std.ch and compare to CLOSE ALL.
  339.  
  340.   ^bWork Around(s)^b
  341.  
  342.   Select(0) will 'reset' work areas so that 1 will be the next open
  343.   work area. Also Use FileName NEW will select workarea 1.
  344.  
  345. ==============================================================================
  346.   CLOSE-UP          Problem with CLOSE-UP remote operation.
  347.  
  348.   ^bClipper Version^b  1.29 dtd 04/15/91.
  349.  
  350.   ^bProblem Statement^b
  351.  
  352.   Keys may not be recognized when using CLOSE-UP remote operation.
  353.  
  354.   ^bCause^b
  355.  
  356.   Incorrect CLOSE-UP settings.
  357.  
  358.   ^bWork Around(s)^b
  359.  
  360.   Set CLOSE-UP keys to Advanced (requires version 3.0A).
  361.  
  362. ==============================================================================
  363.   COMMAND.COM       Clipper in a batch file with DOS 5.0.
  364.  
  365.   ^bClipper Version^b  1.29 dtd 04/15/91.
  366.  
  367.   ^bProblem Statement^b
  368.  
  369.   When a Clipper program is executed from a batch file, using DOS 5.0,
  370.   you may get a "Missing Command.com" message on exit.
  371.  
  372.   ^bCause^b
  373.  
  374.   Unknown
  375.  
  376.   ^bWork Around(s)^b
  377.  
  378.   Put the following in the batch file, before executing the Clipper app:
  379.  
  380.        %COMSPEC% /C EXIT
  381.  
  382. ==============================================================================
  383.   COMPILER          Miscellaneous observations.
  384.  
  385.   ^bClipper Version^b  1.29 dtd 04/15/91.
  386.  
  387.   ^bObservations^b
  388.  
  389.   1) IF the /P parameter is used in SET CLIPPERCMD and in the command
  390.   line, the result is no .ppo file.
  391.  
  392.   2) Reminder, per the manual, pg. 3-2, SET CLIPPERCMD or command line
  393.   options MUST be separated by a space (or the remainder will be ignored).
  394.  
  395.   3) /O Compiler Option ( Programming and Utilities Guide, pg 3-10)
  396.      If only a path is supplied, it must end with \.
  397.  
  398.   4) Compiler error documentation is incomplete; e.g., Fatal error 3039,
  399.      phase error is not documented.
  400.  
  401. ==============================================================================
  402.   DBCREATEIND()     Requires <bKeyExpr> parameter.
  403.  
  404.   ^bClipper Version^b  1.29 dtd 04/15/91.
  405.  
  406.   ^bProblem Statement^b
  407.  
  408.   The NG states that the third parameter, <bKeyExpr>, is optional.
  409.  
  410.   ^bWork Around(s)^b
  411.  
  412.   Revise your documentation.
  413.  
  414. ==============================================================================
  415.   DBEDIT()*         Locks up with return value of 2.
  416.  
  417.   ^bClipper Version^b  1.29 dtd 04/15/91.
  418.  
  419.   ^bProblem Statement^b
  420.  
  421.   When a UDF returns a value of 2, DBEdit locks up.
  422.  
  423.   ^bCause^b
  424.  
  425.   Unknown.
  426.  
  427.   ^bWork Around(s)^b
  428.  
  429.   1) Use TBrowse.
  430.  
  431.   2) If you still want to use DBEdit, then:
  432.        a) save the recno() of the following record
  433.        b) "go top"
  434.        c) go to the saved recno()
  435.        d) _then_ refresh your screen.
  436.  
  437. ==============================================================================
  438.   DBF FILES         Assure proper closing.
  439.  
  440.   ^bClipper Version^b  1.29 dtd 04/15/91.
  441.  
  442.   ^bGeneral Comment^b
  443.  
  444.   5.01 is very sensitive about work area management. Assure that files,
  445.   including indices, are properly closed before attempting things such
  446.   as APPEND FROM.
  447.  
  448. ==============================================================================
  449.   DBU               Locks up with empty file.
  450.  
  451.   ^bClipper Version^b  1.29 dtd 04/15/91.
  452.  
  453.   ^bProblem Statement^b
  454.  
  455.   The "Getting Started" manual, page 4-8, indicates, to add a record to
  456.   an empty file, 'just start typing'. This will cause a lock-up.
  457.  
  458.   ^bCause^b
  459.  
  460.   Documentation error.
  461.  
  462.   ^bWork Around(s)^b
  463.  
  464.   Press K_DOWN, before typing other characters.
  465.  
  466. ==============================================================================
  467.   Division by Zero    Results in zero.
  468.  
  469.   ^bClipper Version^b  1.29 dtd 04/15/91.
  470.  
  471.   ^bProblem Statement^b
  472.  
  473.   Division by zero results in zero vis-a-vis a run time error in S'87.
  474.  
  475.   ^bWork Around(s)^b
  476.  
  477.    a) Test divisors for zero and return whatever you desire.
  478.    b) See Clipper 5.01 ErrorSys for trapping this occassion.
  479.  
  480. ==============================================================================
  481.   DOS 5.0           Using PLL's with DOS 5.0.
  482.  
  483.   ^bClipper Version^b  1.29 dtd 04/15/91.
  484.  
  485.   ^bGeneral Comment^b
  486.  
  487.   If you encounter a problem executing an application.EXE and you are
  488.   using a PLL try:
  489.  
  490.     a) LOADFIX App
  491.  
  492.     b) Re-making the PLL file under DOS 5.0
  493.  
  494.     c) Executing the application from a batch file which 'eats up' some
  495.        of the memory in the first 64Kb segment; e.g.,
  496.  
  497.         @echo off command /e:32000 /c %1 %2 %3 %4 %5 %6 %7
  498.  
  499.  
  500. ==============================================================================
  501.   DOS ERROR 4       Encountered on a network.
  502.  
  503.   ^bClipper Version^b  1.29 dtd 04/15/91.
  504.  
  505.   ^bGeneral Comment^b
  506.  
  507.   If you encounter DOS Error 4 on a network, check that your SHELL.CFG
  508.   file has a sufficent number of files specified. Without a FILES=
  509.   statement, the default will be 40 (Novell).
  510.  
  511. ==============================================================================
  512.   FIELDBLOCK()      Does not return NIL for invalid cFieldName
  513.  
  514.   ^bClipper Version^b  1.29 dtd 04/15/91.
  515.  
  516.   ^bProblem Statement^b
  517.  
  518.   The NG erroneously states that FIELDBLOCK will return NIL if <cFieldName>
  519.   is not in the current work area. FIELDBLOCK will return a code block,
  520.   which, when evaluated, will cause a runtime error.
  521.  
  522.   ^bWork Around(s)^b
  523.  
  524.    Verify fields, before using FIELDBLOCK.
  525. ==============================================================================
  526.  
  527. ==============================================================================
  528.   FIELDWBLOCK()     Does not return NIL for invalid cFieldName
  529.  
  530.   ^bClipper Version^b  1.29 dtd 04/15/91.
  531.  
  532.   ^bProblem Statement^b
  533.  
  534.   The NG erroneously states that FIELDWBLOCK will return NIL if <cFieldName>
  535.   is not in the designated work area. FIELDBLOCK will return a code block,
  536.   which, when evaluated, will cause a runtime error.
  537.  
  538.   ^bWork Around(s)^b
  539.  
  540.    Verify fields, before using FIELDWBLOCK.
  541. ==============================================================================
  542.  
  543. ==============================================================================
  544.   FOR..NEXT..STEP   Use Integers.
  545.  
  546.   ^bClipper Version^b  1.29 dtd 04/15/91.
  547.  
  548.   ^bProblem Statement^b
  549.  
  550.   The following will not produce the desired effect:
  551.  
  552.       FOR n := 1 to 2 step .1
  553.         ? n                      => 1 thru 1.9
  554.       NEXT
  555.  
  556.   ^bCause^b
  557.  
  558.   Clipper numerics.
  559.  
  560.   ^bWork Around(s)^b
  561.  
  562.   Use integers in the loop statements and convert within the loop; e.g.:
  563.  
  564.   FOR n := 10 TO 20 STEP 1
  565.     j := n / 10
  566.     ? j
  567.   NEXT
  568.  
  569. ==============================================================================
  570.  
  571.  
  572. ==============================================================================
  573.   ERRORSYS.PRG      Not compatible with S'87.
  574.  
  575.   ^bClipper Version^b  1.29 dtd 04/15/91.
  576.  
  577.   ^bProblem Statement^b
  578.  
  579.   Clipper 5.0's ERRORSYS.PRG is incompatible with S'87 routines.
  580.  
  581.   ^bWork Around(s)^b
  582.  
  583.   Use the new ErrorSys.
  584.  
  585.   ^bNote:^b  You may wish to download ERS501.ZIP from Nanforum for
  586.   S'87 to 5.01 compatibilty solutions.
  587.  
  588. ==============================================================================
  589.   Get:Delete()      Documentation omission.
  590.  
  591.   ^bClipper Version^b  1.29 dtd 04/15/91.
  592.  
  593.   ^bProblem Statement^b
  594.  
  595.   Get:Delete() Syntax is not in documentation.
  596.  
  597.   ^bCause^b
  598.  
  599.   Documentation omission.
  600.  
  601.   ^bWork Around(s)^b
  602.  
  603.   Annotate your documentation to add the definition to the GET Class,
  604.   Cursor Movement Methods definitions
  605.  
  606.       delete()     Deletes the character under the cursor
  607.  
  608. ==============================================================================
  609.   Get:Subscript()   Works the same on any dimension array.
  610.  
  611.   ^bClipper Version^b  1.29 dtd 04/15/91.
  612.  
  613.   ^bProblem Statement^b
  614.  
  615.   The NG states that Get:Subscript() returns a number for a single
  616.   dimension array. Get:Subscript() returns an array of number(s) for
  617.   any dimension array.
  618.  
  619.   ^bCause^b
  620.  
  621.   Documentation error.
  622.  
  623.   ^bWork Around(s)^b
  624.  
  625.   Annotate your documentation.
  626.  
  627. ==============================================================================
  628.   INTERNAL ERRORS   No documentation. See User-upload, CL5IEn.ZIP
  629.  
  630.   ^bClipper Version^b  1.29 dtd 04/15/91.
  631.  
  632.   ^bProblem Statement^b
  633.  
  634.   Nantucket(r) has not supplied Internal Error documentation.
  635.  
  636.   ^bWork Around^b
  637.  
  638.   None; however, CL5IEn.ZIP in the NanForum library may be of some help.
  639.  
  640. ==============================================================================
  641.   JOIN              FIELDS statement required for secondary fields.
  642.  
  643.   ^bClipper Version^b  1.29 dtd 04/15/91.
  644.  
  645.   ^bProblem Statement^b
  646.  
  647.   Join will not incorporate secondary file fields, unless so specified
  648.   by the FIELDS argument. This is different than S'87, but noted in the
  649.   docs.
  650.  
  651.   ^bWork Around^b
  652.  
  653.   Use FIELDS argument if you want to include secondary fields in your
  654.   resultant .dbf.
  655.  
  656. ==============================================================================
  657.   LOCAL             Inline assignment clarification.
  658.  
  659.   ^bClipper Version^b  1.29 dtd 04/15/91.
  660.  
  661.   ^bClarification:^b
  662.  
  663.   Inline assignments of the following form:
  664.  
  665.      LOCAL a := b := c:= 0
  666.  
  667.   result in LOCAL a and PRIVATE b and c. Use:
  668.      LOCAL a, b, c
  669.      a := b := c := 0
  670.  
  671.   Further, LOCAL x := 1, y := x + 2, z := y + 4  will cause a run-time
  672.   error: BASE/1081 Argument Error: +. Use:
  673.      LOCAL x, y, z
  674.      x := 1; y := x + 2; z := y + 4   or
  675.  
  676.      LOCAL x := 1
  677.      LOCAL y := x + 2
  678.      LOCAL z := y + 4
  679.  
  680. ==============================================================================
  681.   Macro Compiler    Unacceptable codeblock contents.                   ^b^CB3D^CB3 ^CB3 ^CB3 ^CB3^b
  682.  
  683.   ^bClipper Version^b  1.29 dtd 04/15/91.
  684.  
  685.   ^bProblem Statement^b
  686.  
  687.   The macro compiler cannot handle the following types of things when
  688.   attempting to compile a code block:
  689.  
  690.     1) Assignment, Increment and Decrement Operators; e.g., :=, ++.
  691.  
  692.     2) A nested code block.
  693.  
  694.   ^bCause^b
  695.  
  696.   Unknown.
  697.  
  698.   ^bWork Around(s)^b
  699.  
  700.   When possible, substitute an acceptable expression; e.g., var + 1.
  701.  
  702. ==============================================================================
  703.   MISC              Miscellaneous clarification/anomalies.
  704.  
  705.   ^bClipper Version^b  1.29 dtd 04/15/91.
  706.  
  707.   1) NDX File Support ( Card contained with Clipper 5.0 )
  708.      You must request this feature from Nantucket(r). Not available
  709.      as of early June.
  710.  
  711.   2) MEMVARBLOCK() (NG Function Description)
  712.      MEMVARBLOCK() cannot be used to create set-get blocks for LOCAL
  713.      or STATIC variables.
  714.  
  715.   3) Code block parameter visibility - documentation anomaly.
  716.      Page 1-21 of the Clipper 5 Reference, last sentence, 2nd paragraph
  717.      reads: "....a declaration that occurs within a code block (a block
  718.      parameter), applies to that code block and any code blocks nested
  719.      within it.". The block parameter IS NOT visible to nested code blocks,
  720.      unless you pass it.
  721.  
  722.   4) Menu.prg example on page 1-2 of the Reference Manual has as its
  723.      first line '#include "Database.prg" ...'. This directive should
  724.      be placed at the end of the program (it includes generic database
  725.      functions).
  726.  
  727.   5) STATIC arrays. Documentation anomaly, pg. 1-57. Contrary to the
  728.      documentation, STATIC arrays are also dynamic.
  729.  
  730.   6) The following program results in a run-time error because x was not
  731.      initialized; however, the error message, "Error BASE/1087  Argument
  732.      error: -- " should reference ++ instead.
  733.  
  734.               function main
  735.               local x
  736.               x++
  737.               return nil
  738.  
  739.   7) The COPY FILE command doesn't throw an error to the error handler if
  740.      there is an "out of drive space" error.
  741.  
  742.   8) An corrupted index error may refer to the prior index in a list.
  743.  
  744.   9) There _is_ a, to be defined, limit to what TBrowse can handle in terms
  745.      of number of fields versus screen display rows.
  746.  
  747.  10) A memory overbooked error may be caused by too many #define statements.
  748.  
  749.  11) When using @ .. GET aArray[nCtr] VALID SomeFunc(oGet) in a FOR nCtr ..
  750.      loop, the nCtr can't be used in SomeFunc(oGet), (it will have a value
  751.      of n + 1). Use oGet:getVar() to retrieve the get value for validation.
  752.  
  753.  12) The following variations of InKey() all produce the same effect as
  754.      INKEY(0) :  Inkey(NIL), Inkey(""), Inkey(cString).
  755.  
  756.  
  757. ==============================================================================
  758.   MEMORY()          Memory(3) and (4) undocumented.
  759.  
  760.   ^bClipper Version^b  1.29 dtd 04/15/91.
  761.  
  762.   Memory(3) returns the approximate amount of memory allocated to the SVOS.
  763.  
  764.   Memory(4) returns the amount of Expanded Memory available.
  765.  
  766. ==============================================================================
  767.   MEMOLINE()        Minimum <nLineLength> is 1.
  768.  
  769.   ^bClipper Version^b  1.29 dtd 04/15/91.
  770.  
  771.   ^bProblem Statement^b
  772.  
  773.   The minimum for the <nLineLength> parameter has been reduced to 1.
  774.   This has not been documented.
  775.  
  776.   ^bCause^b
  777.  
  778.   N/A.
  779.  
  780.   ^bWork Around(s)^b
  781.  
  782.   Annotate your documentation.
  783.  
  784. ==============================================================================
  785.   MLCOUNT()         Minimum <nLineLength> is 1.
  786.  
  787.   ^bClipper Version^b  1.29 dtd 04/15/91.
  788.  
  789.   ^bProblem Statement^b
  790.  
  791.   The minimum for the <nLineLength> parameter has been reduced to 1.
  792.   This has not been documented.
  793.  
  794.   ^bCause^b
  795.  
  796.   N/A.
  797.  
  798.   ^bWork Around(s)^b
  799.  
  800.   Annotate your documentation.
  801.  
  802. ==============================================================================
  803.   MLCTOPOS()        Position reporting error.
  804.  
  805.   ^bClipper Version^b  1.29 dtd 04/15/91.
  806.  
  807.   ^bProblem Statement^b
  808.  
  809.   If Word Wrap is ON _and_ the line preceeding the one for which the
  810.   position is being determined is either the same length or length -1
  811.   of the line length specified in the function call.
  812.  
  813.   ( For example, if nLine_Len is specified as 66 and a call is made to a
  814.   row/columnn where the previous physical line is either 65 or 66 characters
  815.   long.) - per  DORMAN BLACKMAN 73047,177.
  816.  
  817.   MLCTOPOS() will report the position of the previous chr(141) character,
  818.   regardless of where the cursor is on the line.
  819.  
  820.   ^bCause^b
  821.  
  822.   Unknown.
  823.  
  824.   ^bWork Around(s)^b
  825.  
  826.   Unknown.
  827.  
  828. ==============================================================================
  829. ==============================================================================
  830.   MLPOS()           Position reporting error.
  831.  
  832.   ^bClipper Version^b  1.29 dtd 04/15/91.
  833.  
  834.   ^bProblem Statement^b
  835.  
  836.   If Word Wrap is ON _and_ the line preceeding the one for which the
  837.   position is being determined is either the same length or length -1
  838.   of the line length specified in the function call.
  839.  
  840.   ( For example, if nLine_Len is specified as 66 and a call is made to a
  841.   row/columnn where the previous physical line is either 65 or 66 characters
  842.   long.) - per  DORMAN BLACKMAN 73047,177.
  843.  
  844.   MLPOS() will report a position that is 2 less than the actual line starting
  845.   position. This only applies to the 1st line following the 'long line'. It
  846.   corrects itself on the 2nd and subsequent lines (as long as there are no
  847.   more 'long lines').
  848.  
  849.   ^bCause^b
  850.  
  851.   Unknown.
  852.  
  853.   ^bWork Around(s)^b
  854.  
  855.   Use MLPOS() to determine nlOffset (line offset) and add 2 if
  856.   SUBSTR(cMemo, nlOffset, 1) == Chr(141).
  857.  
  858. ==============================================================================
  859. ==============================================================================
  860.   MPOSTOLC()        Position reporting error.
  861.  
  862.   ^bClipper Version^b  1.29 dtd 04/15/91.
  863.  
  864.   ^bProblem Statement^b
  865.  
  866.   If Word Wrap is ON _and_ the line preceeding the one for which the
  867.   position is being determined is either the same length or length -1
  868.   of the line length specified in the function call.
  869.  
  870.   ( For example, if nLine_Len is specified as 66 and a call is made to a
  871.   row/columnn where the previous physical line is either 65 or 66 characters
  872.   long.) - per  DORMAN BLACKMAN 73047,177.
  873.  
  874.   MPOSTOLC() has an offset error of plus 3.
  875.  
  876.   ^bCause^b
  877.  
  878.   Unknown.
  879.  
  880.   ^bWork Around(s)^b
  881.  
  882.   Unknown.
  883.  
  884. ==============================================================================
  885.  
  886. ==============================================================================
  887.   MULTI-STATEMENT   Multi-statement lines, CAUTION.
  888.  
  889.   ^bClipper Version^b  1.29 dtd 04/15/91.
  890.  
  891.   ^bProblem Statement^b
  892.  
  893.   When using multiple statements on one programming line; i.e.;
  894.   separating commands with a semi-colon; there are several commands
  895.   which will cause erroneous results, if they are not at the end of
  896.   line.
  897.  
  898.   ^bCause^b
  899.  
  900.   Pre-processor action.
  901.  
  902.   ^bWork Around(s)^b
  903.  
  904.   Make sure that the following commands, if used, appear at the end
  905.   of the line, ONLY.
  906.  
  907.   ENDDO    <*x*>             SET STEP <*x*>
  908.   ENDIF    <*x*>             SET SAFETY <*x*>
  909.   ENDCASE  <*x*>             SET TALK <*x*>
  910.   ENDFOR   <*x*>             SET PATH TO <*path*>
  911.   SET ECHO <*x*>             SET COLOR TO  <*spec*>
  912.   SET HEADING <*x*>          SET COLOUR TO <*spec*>
  913.   SET MENU <*x*>             RUN <*cmd*>
  914.   SET STATUS <*x*>           ! <*cmd*>
  915.  
  916.   COPY   TO   <(file)>  DELIMITED  WITH <*delim*>
  917.   APPEND FROM <(file)>  DELIMITED  WITH <*delim*>
  918.  
  919. ==============================================================================
  920.   NETWORKS          Seeks and Indexing comments.
  921.  
  922.   ^bClipper Version^b  1.29 dtd 04/15/91.
  923.  
  924.   ^bProblem Statement^b  per Darren DeLoach [76264,1042]
  925.  
  926.   1) A bug exists which can result in failed SEEK statements on a
  927.      workstation whenever _another_ workstation on the network edits the
  928.      logical top record in the file to have a new index key which moves it
  929.      in the index such that it is no longer at the logical top-of-file.
  930.      Other stations do not see the new index value in the NTX pages, and so
  931.      incorrectly perform SEEKs in the file.  The problem only occurs with
  932.      the logical first record in the file; adding new records does not cause
  933.      the problem, even if you are adding the first record in the file.
  934.  
  935.   2) General comment on indexing (see workaround #2).
  936.  
  937.   ^bCause^b
  938.  
  939.   1) Unknown.
  940.   2) N/A
  941.  
  942.   ^bWork Around(s)^b
  943.  
  944.   1) Setting SOFTSEEK ON seems to make SEEK perform correctly.  A GO TOP
  945.      before the SEEK worked in one specific case, but is not guaranteed
  946.      to work in all situations.
  947.  
  948.   2) A user has reported that the following methodology has eliminated
  949.      problems he was having with indices:
  950.  
  951.         Lock the File
  952.         Index the File
  953.         Close the Index
  954.         UnLock the File
  955.         Set Index to ...
  956.  
  957. ==============================================================================
  958.   NG MODE           Un-documented Norton(r) Guide Mode.
  959.  
  960.   ^bClipper Version^b  1.29 dtd 04/15/91.
  961.  
  962.   ^bProblem Statement^b
  963.  
  964.   NG can be executed in a mode which will permit it to unload from
  965.   memory when F10 or Escape is used to exit the program.
  966.  
  967.   ^bCause^b
  968.  
  969.   Documentation omission.
  970.  
  971.   ^bWork Around(s)^b
  972.  
  973.   Enter NG TEST.NG at the DOS prompt. When NG receives the specific
  974.     parameter TEST.NG, it will load in the above described mode.
  975.     Annotate your documentation.
  976.  
  977.   ^bNote^b TEST.NG is the specific parameter to be used. This is NOT
  978.   the name of an existing file.
  979.  
  980. ==============================================================================
  981.   NOSNOW()          Returns lState, not NIL
  982.  
  983.   ^bClipper Version^b  1.29 dtd 04/15/91.
  984.  
  985.   ^bProblem Statement^b
  986.  
  987.   NOSNOW( <lToggle> ) returns a logical value indicating current setting,
  988.   not NIL, as stated in the NG.
  989.  
  990.   ^bCause^b
  991.  
  992.   N/A.
  993.  
  994.   ^bWork Around(s)^b
  995.  
  996.   Annotate your documentation.
  997.  
  998. ==============================================================================
  999.   OPEN ERROR(0)     Potential Fix.
  1000.  
  1001.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1002.  
  1003.   ^bProblem Statement^b
  1004.  
  1005.   a) User was getting the subject error message repeatably.
  1006.  
  1007.   ^bCause^b
  1008.  
  1009.   Unknown.
  1010.  
  1011.   ^bWork Around^b  Per user report:
  1012.  
  1013.   The workaround is to insert a call to indexkey() on an already open dbf,
  1014.   just before the attempt to open the new dbf.
  1015.  
  1016.     ..
  1017.     xx = mastinv->(indexkey(0))  && mastinv.dbf is already open
  1018.     sele 0
  1019.     net_use("store_w",.F.,5)
  1020.     set index to store_w         && this was causing openerror(0)
  1021.     ..
  1022.  
  1023. ==============================================================================
  1024.   PRINT             Miscellaneous Comments.
  1025.  
  1026.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1027.  
  1028.   ^bProblem Statement^b
  1029.  
  1030.   a) When DEVICE is set to print, using @ row, col will not set PROW() and
  1031.      PCOL() to row, col as it did in S'87. (It will clear the noted screen
  1032.      row).
  1033.  
  1034.   b) If printing is directed to a file, the default extension of the file
  1035.      name will be .PRN, not .TXT.
  1036.  
  1037.   ^bCause^b
  1038.  
  1039.   a) See Std.ch
  1040.  
  1041.   b) N/A
  1042.  
  1043.   ^bWork Around(s)^b
  1044.  
  1045.   a) Use @ row, col SAY "" or SETPRC(row, col).
  1046.  
  1047. ==============================================================================
  1048.   PICTURE           Comments on 5.01's PICTURE clause.
  1049.  
  1050.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1051.  
  1052.   ^bProblem Statement^b
  1053.  
  1054.   1) The PICTURE clause will not increase a variable's length.
  1055.      Example:
  1056.  
  1057.         cVar := ""
  1058.         @ row, col get cVar PICTURE "!!!!!"   // Does not work.
  1059.  
  1060.   2) The PICTURE format function, "@Z #" does not perform per S'87.
  1061.      Assuming the get variable is zero, the active get will display 0.
  1062.      Note: Clipper 5.01 documentation has been changed.
  1063.  
  1064.   3) The GET PICTURE format function, "@S<n>" performs differently
  1065.      than S'87; i.e., large values of <n> will not wrap to the next
  1066.      line(s). Clipper 5.01 documentation reflects this change.
  1067.  
  1068.   4) The PICTURE format function "@( " does not work correctly with
  1069.      commas in the picture clause; e.g., try entering -100 below:
  1070.        LOCAL x:= -10, Getlist := {}
  1071.        @ 10, 10 SAY "Enter" GET x PICTURE "@( 99,999"
  1072.        READ
  1073.  
  1074.   5) The PICTURE format function "@R " may not work correctly with
  1075.      character strings; e.g.:
  1076.        LOCAL x:= "213", Getlist := {}
  1077.        @ 10, 10 SAY "Enter" GET x PICTURE "@R (999)"
  1078.        READ
  1079.  
  1080.      Note: numerical vars are formatted correctly.
  1081.  
  1082. ==============================================================================
  1083.   PROMPT MESSAGE    Comments on usage.
  1084.  
  1085.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1086.  
  1087.   ^bProblem Statement^b
  1088.  
  1089.   1) Undocumented feature. @...PROMPT...[MESSAGE] documentation does not
  1090.      indicate that the message may be a code block as well as a <cMessage>.
  1091.  
  1092.   2) The CENTER clause is off by one column; i.e., a centered message will
  1093.      be 1 column to the left of the desired position.
  1094.  
  1095.   ^bCause^b
  1096.  
  1097.   1) N/A.
  1098.  
  1099.   2) Nan Goof.
  1100.  
  1101.   ^bWork Around(s)^b
  1102.  
  1103.   1) Annotate your documentation.
  1104.  
  1105.   2) Use the undocumented feature to call a function which centers the
  1106.      message correctly. Example:
  1107.      @ 10, 10 PROMPT "Hello" MESSAGE {|| Showit("John") }
  1108.      MENU TO nChoice
  1109.  
  1110.      FUNCTION ShowIt(cString)
  1111.        LOCAL nRow := SET(_SET_MESSAGE), nCol
  1112.        nCol := INT( (MAXCOL() + 1 - LEN(TRIM(cString))) / 2 )
  1113.        DEVPOS( nRow, nCol ) ; QQOUT( TRIM(cString) )
  1114.      RETURN ("")
  1115.  
  1116. ==============================================================================
  1117.   RANGE             Not verified unless 'get' is changed.
  1118.  
  1119.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1120.  
  1121.   ^bProblem Statement^b
  1122.  
  1123.   When using @...[SAY]...GET...RANGE, the range will not be verified
  1124.   unless the get is changed.
  1125.  
  1126.   ^bCause^b
  1127.  
  1128.   RangeCheck() function in GETSYS.PRG
  1129.  
  1130.   ^bWork Around(s)^b
  1131.  
  1132.   Modify your copy of GetSys.prg, if this action is unacceptable.
  1133.  
  1134. ==============================================================================
  1135.   RESTORE           Problem with change to higher level privates.
  1136.  
  1137.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1138.  
  1139.   ^bProblem Statement^b
  1140.  
  1141.   RESTSTORE FROM <xcMemFile> ADDITIVE may change the value(s) of higher
  1142.   level privates. An example:
  1143.        // Run this as a standalone program:
  1144.        Procedure MemSave
  1145.          Memvar  VarA
  1146.          Private VarA
  1147.          VarA := 'ABCDEF'
  1148.          Save to Test All Like VarA
  1149.        Return
  1150.       // Then run this:
  1151.       Procedure A
  1152.         Memvar  V1
  1153.         Private V1
  1154.         V1 = 1
  1155.         ? 'Procedure A, V1 Should be 1, V1=',V1    // => 1
  1156.         Do B
  1157.         ? 'Procedure A, V1 Should be 1, V1=',V1    // => 2
  1158.       Return
  1159.       ***********
  1160.       Procedure B
  1161.         Memvar  V1
  1162.         Private V1
  1163.         V1 = 2
  1164.         ? 'Procedure B, V1 Should be 2, V1=',V1    // => 2
  1165.         Do C
  1166.         ? 'Procedure B, V1 Should be 2, V1=',V1    // => 3
  1167.       Return
  1168.       ***********
  1169.       Procedure C
  1170.         MemVar  V1
  1171.         Private V1
  1172.         V1 = 3
  1173.         ? 'Procedure C, V1 Should be 3, V1=',V1    // => 3
  1174.         RESTORE FROM Test ADDITIVE
  1175.       Return
  1176.  
  1177.   ^bCause^b
  1178.  
  1179.   Unknown
  1180.  
  1181.   ^bWork Around(s)^b
  1182.  
  1183.   Don't store variables in .MEM files.
  1184.  
  1185. ==============================================================================
  1186.   RESTSCREEN()      Undocumented defaults.
  1187.  
  1188.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1189.  
  1190.   ^bProblem Statement^b
  1191.  
  1192.   RESTSCREEN() defaults to 0, 0, MaxRow(), MaxCol() if these parameters
  1193.   are NIL.
  1194.  
  1195.   ^bCause^b
  1196.  
  1197.   N/A.
  1198.  
  1199.   ^bWork Around(s)^b
  1200.  
  1201.   Annotate your documentation.
  1202.  
  1203. ==============================================================================
  1204. ==============================================================================
  1205.   RMAKE >           Omit spaces when re-directing error output.
  1206.  
  1207.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1208.  
  1209.   ^bProblem Statement^b
  1210.   This re-direction of error output statement does not work:
  1211.       // Inference rule to compile
  1212.       .prg.obj:
  1213.       clipper $** $(options) > comperr.txt
  1214.  
  1215.   ^bCause^b
  1216.  
  1217.   N/A.
  1218.  
  1219.   ^bWork Around^b
  1220.  
  1221.   Remove the spaces surrounding the >; i.e.,
  1222.        clipper $** $(options)>comperr.txt
  1223.  
  1224. ==============================================================================
  1225.   REINDEX           Does not re-create index file header.
  1226.  
  1227.   ^bClipper Version^b  1.29 dtd 04/15/91 (and Summer '87)
  1228.  
  1229.   ^bProblem Statement^b
  1230.  
  1231.   REINDEX uses the existing index file header. If this is corrupted,
  1232.   the resultant index file will also be invalid.
  1233.  
  1234.   ^bCause^b
  1235.  
  1236.   N/A
  1237.  
  1238.   ^bWork Around(s)^b
  1239.  
  1240.   1) Use INDEX ON to create new indices. Some users have suggested
  1241.      erasing the existing index file prior to INDEX ON usage.
  1242.  
  1243. ==============================================================================
  1244.   REPLICATE         Maximum string length is 65516 characters.
  1245.  
  1246.   ^bClipper Version^b  1.29 dtd 04/15/91 (and Summer '87)
  1247.  
  1248.   ^bProblem Statement^b
  1249.  
  1250.   Contrary to the documentation, the maximum REPLICATE is 65516 bytes.
  1251.  
  1252.   ^bCause^b
  1253.  
  1254.   N/A
  1255.  
  1256.   ^bWork Around(s)^b
  1257.  
  1258.   Annotate your documentation.
  1259.  
  1260. ==============================================================================
  1261.   REPORT FORM       Anomalies with Report forms.
  1262.  
  1263.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1264.  
  1265.   ^bProblem Statement^b
  1266.  
  1267.   1) Multi-line reports cannot be printed using the string +";"+ string
  1268.      method.
  1269.  
  1270.   2) REPORT ... HEADING ".." cannot be printed using the +";"+ method.
  1271.  
  1272.   3) The Group Eject option is not implemented.
  1273.  
  1274.   4) Command line parameters NOEJECT and SUMMARY incorrectly implemented.
  1275.  
  1276.   5) SubSubTotal problem.
  1277.  
  1278.   6) First page line counting error.
  1279.  
  1280.   7) Wasted header spacing.
  1281.  
  1282.   8) SET PATH problem in FRMBACK.PRG.
  1283.  
  1284.   9) Potential run-time error due to ListAsArray() in FRMBACK.PRG.
  1285.  
  1286.   ^bCause^b
  1287.  
  1288.   Errors and Ommissions
  1289.  
  1290.   ^bWork Around(s)^b
  1291.  
  1292.   8) Edit Line 154 in FRMBACK.PRG as follows:
  1293.  
  1294.      Change:    paths := ListAsArray( s )
  1295.  
  1296.      To read:  paths := ListAsArray( s, ";")
  1297.  
  1298.   9) Edit ListAsArray() to check for nWidth > 0. The following works
  1299.      for me:
  1300.  
  1301.      FUNCTION ListasArray(cList, cDelim, nWide)
  1302.        LOCAL aList := {}, lNum
  1303.        cDelim := IF(VALTYPE(cDelim) == 'C', cDelim, ";")
  1304.        cList  := TRIM( STRTRAN(cList, cdelim, chr(13)+chr(10)) )
  1305.        nWide  := IF( (lNum := (VALTYPE(nWide) == 'N' .and. nWide > 0 )), ;
  1306.                               nWide, LEN(cList) )
  1307.        aList := ARRAY(MLCOUNT(cList,nWide,1,.T.))
  1308.        AEVAL(aList, {|a,e| ;
  1309.              aList[e] := IF(lNum, MEMOLINE(cList,nWide,e,1,.T.),;
  1310.                               TRIM(MEMOLINE(cList,nWide,e,1,.T.)))})
  1311.      RETURN aList
  1312.  
  1313.   ^bNotes^b
  1314.  
  1315.   C5REP6.ZIP, on NANFORUM, contains a FrmRun.prg which fixes 1 - 7, above.
  1316.  
  1317. ==============================================================================
  1318.   RESERVED WORDS    Comments on reserved words.
  1319.  
  1320.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1321.  
  1322.   ^bProblem Statement^b
  1323.  
  1324.   Numerous users have reported problems which have been traced to the
  1325.   use of variable names which conflict with Clipper 5.0 commands or
  1326.   statements.
  1327.  
  1328.   ^bWork Around(s)^b
  1329.  
  1330.   Exercise caution in the choice of variable names. Remember, if your
  1331.   variable name is four characters long and these characters match the
  1332.   first four letters of a Clipper 5.0 or UDC command, you've got problems.
  1333.   Just avoid this situation as well as names that match Clipper 5.0
  1334.   commands and statements. Remember also, If you create a UDF of the same
  1335.   name as a Clipper 5.0 function, its action will supersede Clipper's.
  1336.  
  1337. ==============================================================================
  1338.   RL                Use with caution.
  1339.  
  1340.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1341.  
  1342.   ^bProblem Statement^b
  1343.  
  1344.   5.01's RL utility is a warmed over Summer '87. It inherits the anomalies
  1345.   of it's parent. F1 Help is not incorporated. Some of the things to watch
  1346.   out for are:
  1347.  
  1348.     1) Adding an extra column inadvertently.
  1349.     2) Totaling the last column.
  1350.     3) The eject before/after print options.
  1351.  
  1352.   ^bCause^b
  1353.  
  1354.   Programming errors.
  1355.  
  1356.   ^bWork Around(s)^b
  1357.  
  1358.   Use PgUp to save 'gets'. On item 2, save the report without indicating
  1359.   totals and then try a second time. Re-write RL.
  1360.  
  1361. ==============================================================================
  1362.   ROUND()           Returns unpredictable results.
  1363.  
  1364.   ^bClipper Version^b  1.29 dtd 04/15/91 (and Summer '87).
  1365.  
  1366.   ^bProblem Statement^b
  1367.  
  1368.   The ROUND() function, like its predecessor in S'87, does not return
  1369.   the desired result, in certain cases.
  1370.  
  1371.   ^bCause^b
  1372.   Unknown.
  1373.  
  1374.   ^bWork Around(s)^b
  1375.  
  1376.   The following function seems to do the trick:
  1377.  
  1378.   FUNCTION ROUNDIT(nNumber, nPlaces)
  1379.   nPlaces := IF( nPlaces == NIL, 0, nPlaces )
  1380.   RETURN IF(nNumber < 0.0, -1.0, 1.0) * ;
  1381.          INT( ABS(nNumber) * 10 ^^ nPlaces + 0.50 + 10 ^^ -12 ) / 10 ^^ nPlaces
  1382.  
  1383.   ^bNotes^b
  1384.   FYI, here are some particularly unique numbers which do not Round() up.
  1385.     1.265   146.795   8.245   18.435   10.165   16.685
  1386.     1.025     4.645   8.155   35.105  286.335    4.515  4.225
  1387.  
  1388. ==============================================================================
  1389.   RTLINK/DESQVIEW   Undocumented parameters.
  1390.  
  1391.   ^bClipper Version^b  1.29 dtd 04/15/91 (and Summer '87).
  1392.  
  1393.   ^bProblem Statement^b
  1394.  
  1395.   The following edited statement was supplied by a user:
  1396.  
  1397.   RTLink running inside a DESQview window is not well-behaved.
  1398.   Unless you issue the following SET commands (either before you enter
  1399.   DESQview or inside the window where .RTLink will run), it writes outside
  1400.   its memory area and can crash a system; necessitating a hardware reboot.
  1401.  
  1402.                 SET RTLEMSOFF=1
  1403.                 SET RTLXMSOFF=1
  1404.  
  1405.   Note: Problem confirmed by Quarterdeck with window protection level 3.
  1406.         Solution provided by QuarterDeck.
  1407.  
  1408. ==============================================================================
  1409.   SAVESCREEN()      Undocumented defaults.
  1410.  
  1411.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1412.  
  1413.   ^bProblem Statement^b
  1414.  
  1415.   SAVESCREEN() defaults to 0, 0, MaxRow(), MaxCol() if these parameters
  1416.   are missing.
  1417.  
  1418.   ^bCause^b
  1419.  
  1420.   N/A.
  1421.  
  1422.   ^bWork Around(s)^b
  1423.  
  1424.   Annotate your documentation.
  1425.  
  1426. ==============================================================================
  1427.  
  1428. ==============================================================================
  1429.   SCREEN            Misc. SETMODE(), SETBLINK(), SETCOLOR()
  1430.  
  1431.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1432.  
  1433.   ^bProblem Statement^b
  1434.  
  1435.   1) Cursor anomalies. Try using SET CLIPPER=CGACURS if you are
  1436.      experiencing cursor anomalies. Reference: NG Environment.
  1437.  
  1438.   2) A 'splash of color' may remain at 0, 65 after using SETCOLOR()
  1439.      and GET. This can be eliminated by SET SCOREBOARD OFF.
  1440.  
  1441.   3) SETBLINK(), SETMODE() (NG Function Descriptions)
  1442.      These are environmental or screen attributes; hence, they will
  1443.      change the full screen when invoked. You may want to save the
  1444.      screen before invoking either of these functions.
  1445.  
  1446.      SETMODE() should be followed by a CLS or CLEAR SCREEN.
  1447.      The following routine will put the display in 50 row mode and
  1448.      turn off the cursor - on an IBM PS/2 Model 80.
  1449.  
  1450.         SetMode(50,80)
  1451.         Cls
  1452.         SetCursor(1)
  1453.         FOR nI := 1.0 to 250; NEXT    // Adjust delay as required.
  1454.         SetCursor(0)
  1455.  
  1456.      Similar programming is required when returning to 25 row mode.
  1457.  
  1458.      SETBLINK() is a tricky little devil. Despite the fact that its
  1459.      alleged default is .T., it may be necessary to issue SetBlink(.T.)
  1460.      before any blinking will occur. Further, it may be necessary to
  1461.      re-issue a SetColor(cVar) after the SetBlink(lVar) call. Takes
  1462.      a little experimentation <g>. Note that a string saved by
  1463.      Set(_SET_COLOR), containing an * will end up with a + in its
  1464.      place.
  1465.  
  1466. ==============================================================================
  1467.   SET()             Missing Documentation.
  1468.  
  1469.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1470.  
  1471.   ^bProblem Statement^b
  1472.  
  1473.   1) SET(_SET_EXTRA, <lVar> ) and SET(_SET_TYPEAHEAD, <nVar> ) are missing
  1474.      from the documentation.
  1475.  
  1476.   2) SET(_SET_EXTRA) always returns NIL, not it's present state.
  1477.  
  1478.   ^bCause^b
  1479.  
  1480.   Unknown.
  1481.  
  1482.   ^bWork Around(s)^b
  1483.  
  1484.   SET(_SET_EXTRA) is similar to SET(_SET_ALTERNATE) and SET(_SET_TYPEAHEAD)
  1485.   is similar to SET TYPEAHEAD TO. Annotate your documentation.
  1486.  
  1487. ==============================================================================
  1488.   SET CLIPPER       SET CLIPPER syntax and notes.
  1489.  
  1490.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1491.  
  1492.   ^bProblem Statement^b
  1493.  
  1494.   a) There is a problem in 5.01 with how Clipper applications read the
  1495.      CLIPPER environment variable.
  1496.  
  1497.   b) The //NOALERT variable is not documented.
  1498.  
  1499.   ^bCause^b
  1500.  
  1501.   a) Unknown.
  1502.  
  1503.   b) Documentation omission.
  1504.  
  1505.   ^bWork Around(s)^b
  1506.  
  1507.   a) Prefix all settings with a // and put a space between them.
  1508.      Put a colon between the setting and its value.  For example:
  1509.  
  1510.      SET CLIPPER=//F:50 //SWAPPATH:'C:\TEMP' //TEMPPATH:'C:\TEMP'
  1511.  
  1512.   b) NOALERT may be used to disable any messages provided by the ALERT()
  1513.      function.
  1514.  
  1515. ==============================================================================
  1516.   SET COLOUR        Incorrect syntax in STD.CH.
  1517.  
  1518.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1519.  
  1520.   ^bProblem Statement^b
  1521.  
  1522.   SET COLOUR directives in STD.CH need to be changed to enable
  1523.   command recognition.
  1524.  
  1525.   ^bCause^b
  1526.   Incorrect programming.
  1527.  
  1528.   ^bWork Around(s)^b
  1529.  
  1530.   #command SET COLOUR TO [<*spec*>]  => SetColor( #<spec> )
  1531.                         or
  1532.   #command SET COLOUR TO [<*spec*>]  => SET COLOR TO <spec>
  1533.  
  1534. ==============================================================================
  1535.   SWAPPATH          60 Character limit.
  1536.  
  1537.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1538.  
  1539.   ^bProblem Statement^b
  1540.  
  1541.   The SWAPPATH environmental statement is limited to 60 characters.
  1542.  
  1543.   ^bCause^b
  1544.  
  1545.   Unknown
  1546.  
  1547.   ^bWork Around(s)^b
  1548.  
  1549.   Annotate your documentation.
  1550.  
  1551. ==============================================================================
  1552.  
  1553. ==============================================================================
  1554.   TBROWSE           Miscellaneous Comments
  1555.  
  1556.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1557.  
  1558.   ^bProblem Statement^b
  1559.  
  1560.   1) oTb:Freeze must be defined _after_ the column to be frozen is added
  1561.      to the browse object.
  1562.  
  1563.   2) oTb:setColumn returns the browse object, not the column object as
  1564.      stated in the NG.
  1565.  
  1566.   3) oTb:colorSpec affects the color outside the browse window. Use
  1567.      SetColor() before writing to this area.
  1568.  
  1569.   4) Using oTb:panRight() and oTb:colorRect() together can cause a runaway
  1570.      situation requiring a warm boot - specifically, this sequence:
  1571.  
  1572.   oTb:colorRect(), InKey(), oTb:panRight(), oTb:colorRect(), oTb:Stabilize()
  1573.  
  1574.      A solution is to use oTb:refreshCurrent() in place of the 2nd
  1575.      oTb:colorRect() or use the sequence:
  1576.  
  1577.   oTb:colorRect(), InKey(), oTb:colorRect(), oTb:panRight(), oTb:Stabilize()
  1578.  
  1579. ==============================================================================
  1580.   TEMPPATH          60 Character limit.
  1581.  
  1582.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1583.  
  1584.   ^bProblem Statement^b
  1585.  
  1586.   The TEMPPATH environmental statement is limited to 60 characters.
  1587.  
  1588.   ^bCause^b
  1589.  
  1590.   Unknown
  1591.  
  1592.   ^bWork Around(s)^b
  1593.  
  1594.   Annotate your documentation.
  1595.  
  1596. ==============================================================================
  1597. ==============================================================================
  1598.   TEXT*             TO PRINTER _or_ TO FILE
  1599.  
  1600.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1601.  
  1602.   ^bProblem Statement^b
  1603.  
  1604.   The syntax description, in the documentation, indicates [TO PRINTER]
  1605.   [TO FILE (<xcfile>)]. Only one of these options may be used at a time.
  1606.  
  1607.   ^bCause^b
  1608.  
  1609.   STD.CH or documentation error.
  1610.  
  1611.   ^bWork Around(s)^b
  1612.  
  1613.   Unknown.
  1614.  
  1615. ==============================================================================
  1616.   TYPE()            Comments on Clipper 5.0 return values.
  1617.  
  1618.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1619.  
  1620.   ^bProblem Statement^b
  1621.  
  1622.   1) TYPE("LocalVar" or "StaticVar") returns 'U'.
  1623.  
  1624.   2) Successive uses of TYPE may produce erroneous values; e.g.,
  1625.  
  1626.      ? TYPE( "{| a | Foo( a ),     }" )    // Prints "UE", syntax error.
  1627.  
  1628.      ? TYPE( "{| a | Foo( a ), .T. }" )    // Error has been corrected, but
  1629.                                            // TYPE() still returns "UE".
  1630.      ? TYPE( "{| a | Foo( a ), .T. }" )    // This time, TYPE() returns "B".
  1631.  
  1632.   ^bCause^b
  1633.  
  1634.   1) TYPE("xVar") uses macro expansion to evaluate variables.
  1635.  
  1636.   2) Unknown.
  1637.  
  1638.   ^bWork Around(s)^b
  1639.  
  1640.   1) Use VALTYPE(var)
  1641.  
  1642.   2) Use a function; e.g., the following by Michael Vivino 72210,2630
  1643.  
  1644.      FUNCTION ChkBlock( cBlock )
  1645.        TYPE( "{|| .T. }" )            // reset any prior error by passing
  1646.                                       // a valid block to type()
  1647.      RETURN TYPE( cBlock ) == [B]     // Now syntax-check the passed block
  1648.  
  1649.   ^bNotes^b
  1650.  
  1651.        TYPE("Undeclared_Var")      Returns 'U'
  1652.        VALTYPE(Undeclared_Var)     Returns runtime error
  1653.  
  1654. ==============================================================================
  1655.   TYPEAHEAD         Typeahead cannot be set in the 1 to 15 range.
  1656.  
  1657.   ^bClipper Version^b  1.29 dtd 04/15/91.
  1658.  
  1659.   ^bProblem Statement^b
  1660.  
  1661.   SET TYPEAHEAD TO <nVar> or SET(_SET_TYPEAHEAD, <nVar>) do not react
  1662.   to numbers less than the DOS buffer (except 0).
  1663.  
  1664.   ^bCause^b
  1665.  
  1666.   Unknown.
  1667.  
  1668.   ^bWork Around(s)^b per Chuck Friedel [76467,706]
  1669.  
  1670.   *---------------
  1671.   FUNCTION strokes ( nCount )
  1672.   *---------------
  1673.   * retain specified number of keystrokes (oldest)
  1674.   *---------------
  1675.  
  1676.   LOCAL nKey, cChrs := ""
  1677.  
  1678.   DO WHILE nCount-- > 0 .AND. ( nKey := INKEY() ) # 0
  1679.     IF nKey < 0 .OR. nKey > 255    // outside CHR()'s range
  1680.        RETURN NIL
  1681.     ENDIF
  1682.     cChrs += CHR( nKey )
  1683.   ENDDO
  1684.  
  1685.   KEYBOARD ( cChrs )
  1686.  
  1687.   RETURN NIL
  1688.  
  1689. ==============================================================================
  1690.   \SOURCE\SYS       Comments on \CLIPPER5\SOURCE\SYS\ Files.
  1691.  
  1692.    The following files in the \CLIPPER5\SOURCE\SYS sub-directory
  1693.    are hard coded in CLIPPER.EXE. They may be modified, compiled
  1694.    and linked to make changes.
  1695.  
  1696.     FRMDEF.CH                   LBLBACK.PRG
  1697.     FRMBACK.PRG                 LBLRUN.PRG
  1698.     FRMRUN.PRG                  ERRORSYS.PRG
  1699.     LBLDEF.CH                   GETSYS.PRG
  1700. ==============================================================================
  1701.  
  1702.   Credits          That's Thanks Folks!
  1703.  
  1704.   My Thanks to the Sysops and Members of CompuServe for their
  1705.   countless hours of cussing, working and losing sleep to present
  1706.   solutions to the anomalies presented herein. Keep up the Good Work!
  1707.  
  1708.         This is NOT an official Nantucket(r) publication.
  1709.  
  1710.   Please report errors and ommissions to: Jo W. French  74730,1751
  1711.  
  1712.   Note: See Read Me
  1713.  
  1714.